// 如何定义一个 SetOptional 工具类型，支持把给定的keys
// 对应的属性变成可选的？对应的使用示例如下所示：
type Foo = {
  a: number;
  b?: string;
  c: boolean;
};
type SetOptional<F, S extends keyof F> = {
  [K in S]?: F[K];
} & {
  [K in Exclude<keyof F, S>]: F[K];
};
// 测试用例
type SomeOptional = SetOptional<Foo, "a" | "b">;
// type SomeOptional = {
// a?: number; // 该属性已变成可选的
// b?: string; // 保持不变
// c: boolean;
// }
const s: SomeOptional = {
  //   a: 123,
  b: "123",
  c: true,
};
